#include "serverwidget.h"
#include "ui_serverwidget.h"

serverwidget::serverwidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::serverwidget)
{
    ui->setupUi(this);
    tcpServer = nullptr;
    tcpSocket = nullptr;
    //创建监听套接字
    tcpServer = new QTcpServer(this); //指定父对象 回收空间

    //bind+listen 绑定当前网卡所有的ip 绑定端口 也就是设置服务器地址和端口号
    tcpServer->listen(QHostAddress::Any,8888);

    //服务器建立连接
    connect(tcpServer,&QTcpServer::newConnection,[=](){
        // 取出连接好的套接字
        tcpSocket = tcpServer->nextPendingConnection();

        // 获得通信套接字的控制信息
        QString ip = tcpSocket->peerAddress().toString(); //获取连接的ip地址
        quint16 port = tcpSocket->peerPort(); //获取连接的端口号
        QString temp = QString("[%1:%2] 客户端连接成功").arg(ip).arg(port);
        // 显示连接成功
        ui->textBrowserRead->setText(temp);

        // 接收信息 必须放到连接中的槽函数 不然tcpsocket就是一个野指针
        connect(tcpSocket,&QTcpSocket::readyRead,[=](){
            // 从通信套接字中取出内容
            QString str = tcpSocket->readAll();
            //在编辑区域显示,不用settext 这样会覆盖之前的消息
            ui->textBrowserRead->append("客户端："+ str);

        });
    });

}

serverwidget::~serverwidget()
{
    delete ui;
}


void serverwidget::on_buttonsend_clicked()
{
    if(tcpSocket == nullptr){
        return;
    }
    //获取编辑区域的内容
    QString str = ui->textEditWrite->toPlainText();

    //写入通信套接字 协议栈自动发送
    tcpSocket->write(str.toUtf8().data());

    //在编辑区域显示
    ui->textBrowserRead->append("服务端：" + str);

}

void serverwidget::on_buttonclose_clicked()
{
    //通信套接字主动与服务端断开连接
    if(tcpSocket == nullptr){
        return;
    }
    tcpSocket->disconnectFromHost(); //结束聊天

    //关闭 通信套接字
    tcpSocket->close();

    tcpSocket = nullptr;
}
